package educar.gui.teacher;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.io.File;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;

import educar.controllers.AddActividadController;
import educar.controllers.IController;
import educar.controllers.WindowDispose;
import educar.gui.IView;
import educar.idioma.Locale;
import educar.listeners.ButtonListener;
import educar.models.Materia;

import javax.swing.SwingConstants;

public class AddActividad implements IView{
	/*Ventana principal*/
	private JFrame jfWindow;
	/*campo nombre*/
	private JTextField tfCode;
	/*campo descripcion*/
	private JTextField tfDescription;
	/*string path archivo*/
	private String file_path;
	private JTextField tfArchivo;
	private File archivo;
	private Materia materia;
	
	/**
	 * Constructor de la Clase
	 * Crea la ventana que permite definir una
	 * nueva facultad 
	 */
	public AddActividad(Materia materia) {
		setMateria(materia);
		/*configuro y creo la ventana*/
		jfWindow = new JFrame();		
		jfWindow.setIconImage(Toolkit.getDefaultToolkit().getImage(IView.class.getResource("/educar/media/educar-icon2.png")));
		/*Segun la dimension de la pantalla (resolucion) Centro la ventana*/
		Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize();
		Point framePos=new Point((int)(screenSize.width)/2-200,(int)(screenSize.height)/2-150);
		jfWindow.setLocation(framePos);
		/*Renombro la ventana*/
		jfWindow.setTitle(Locale.ADD+" "+Locale.ACTIVITY);
		/*obtengo el panel contenedor y lo configuro*/
		Container container = jfWindow.getContentPane();
		setupMainContainer(container);		
		Component verticalGlue = Box.createVerticalGlue();
		verticalGlue.setPreferredSize(new Dimension(0, 5));
		jfWindow.getContentPane().add(verticalGlue);
		/*configura otras caracteristicas*/
		jfWindow.pack();
		jfWindow.setVisible(true);
		jfWindow.setResizable(false);
		jfWindow.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	
	
	/**
	 * Configura el contenedor de la ventana
	 * */
	private void setupMainContainer(Container container) {
		/*Configura el estilo del contenedor y le agrega un borde en blanco*/
		container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
		((JComponent) container).setBorder(new EmptyBorder(10, 10, 10, 10));

		/*Agrega un texto*/
		JLabel lblWelcome = new JLabel(Locale.ADD+" "+Locale.ACTIVITY);
		lblWelcome.setAlignmentX(Component.CENTER_ALIGNMENT);
		lblWelcome.setFont(new Font("Serif", Font.BOLD, 16));
		lblWelcome.setBorder(new EmptyBorder(0, 10, 10, 10));
		container.add(lblWelcome);
		
		
		
		/*Agrega la casilla de codigo de la actividad*/
		JLabel lblCode = new JLabel(Locale.CODE+" : ");
		lblCode.setHorizontalAlignment(SwingConstants.RIGHT);
		tfCode = new JTextField(20);
		JPanel codePane = new JPanel();
		codePane.setLayout(new BorderLayout(0, 0));
		codePane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
		codePane.add(lblCode,BorderLayout.CENTER);
		codePane.add(tfCode,BorderLayout.LINE_END);
		container.add(codePane);

		
		 /*Agrega la casilla descripcion de la actividad*/
		JLabel lblDescription = new JLabel(Locale.DESCRIPTION+" : ");
		lblDescription.setHorizontalAlignment(SwingConstants.RIGHT);
		tfDescription = new JTextField(20);
		JPanel descriptionPane = new JPanel();
		descriptionPane.setLayout(new BorderLayout(0, 0));
		descriptionPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
		descriptionPane.add(lblDescription,BorderLayout.CENTER);
		descriptionPane.add(tfDescription,BorderLayout.LINE_END);
		container.add(descriptionPane, BorderLayout.PAGE_END);
		
		
		 /*Agrega la casilla file de la actividad*/
		JLabel lblArchivo = new JLabel(Locale.FILE+" : ");
		lblArchivo.setHorizontalAlignment(SwingConstants.RIGHT);
		JPanel archivoPane = new JPanel();
		archivoPane.setLayout(new BorderLayout(0, 0));
		archivoPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
		archivoPane.add(lblArchivo,BorderLayout.CENTER);
		tfArchivo = new JTextField(13);
		JPanel tmp = new JPanel();
		tmp.add(tfArchivo,BorderLayout.CENTER);
		JButton archivo = new JButton(Locale.SEARCH);
		archivo.setAlignmentX(Component.LEFT_ALIGNMENT);
		
		archivo.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e) {selectFile();}});
		
		
		
		tmp.add(archivo,BorderLayout.LINE_END);
		archivoPane.add(tmp,BorderLayout.LINE_END);
		container.add(archivoPane, BorderLayout.PAGE_END);

	
		
		/*Crea un panel que contiene los botones*/
		JPanel buttonsPane = new JPanel();
		buttonsPane.setLayout(new BoxLayout(buttonsPane, BoxLayout.LINE_AXIS));
		
		/*Creo el Boton Add*/
		JButton bAdd = new JButton(Locale.ADD);
		bAdd.setAlignmentX(Component.LEFT_ALIGNMENT);
		ButtonListener saveListener = new ButtonListener();
		IController saveController = new AddActividadController();
		saveController.setView(this);
		saveListener.associate(bAdd, saveController);	
		
		
		/*Creo el Boton Close*/
		JButton bExit = new JButton(Locale.CLOSE);
		ButtonListener closeListener = new ButtonListener();
		IController closeController = new WindowDispose();
		closeController.setView(this);
		closeListener.associate(bExit, closeController);	
		

		
		Component verticalGlue = Box.createVerticalGlue();
		verticalGlue.setPreferredSize(new Dimension(0, 10));
		jfWindow.getContentPane().add(verticalGlue);
		bExit.setAlignmentX(Component.RIGHT_ALIGNMENT);
	
		
		/*Agrego los Botones Guardar-Salir*/
		buttonsPane.add(bAdd);
		/*Un separador entre los botones*/
		Component verticalStrut = Box.createVerticalStrut(20);
		verticalStrut.setMaximumSize(new Dimension(10, 20));
		buttonsPane.add(verticalStrut);
		buttonsPane.add(bExit);
		/*agrego el panel de botones al final del cuadro principal*/
		container.add(buttonsPane, BorderLayout.PAGE_END);
		
	}


		/**
		 * TODOS LOS SET Y GET DE LA CLASE
		 */
		
		/**
		 * Funcion que devuelve el codigo de la facultad a crear
		 * @return "string que contiene el codigo"
		 */
		public String getCode() {
			return tfCode.getText().trim();
		}
		
		/**
		 * Establece el codigo de la facultad
		 * @param oldCode "string codigo viejo"
		 */
		public void setCode(String oldCode) {
			tfCode.setText(oldCode);
		}
		
		/**
		 * Funcion que devuelve la descripcion de la facultad a crear
		 * @return "string que contiene la descripcion"
		 */
		public String getDescription() {
			return tfDescription.getText().trim();
		}
		
		/**
		 * Establece la descripcion vieja de la facultad
		 * @param oldDescription "string con la descripcion"
		 */
		public void setDescription(String oldDescription) {
			tfDescription.setText(oldDescription);
		}
		
		
		/**
		 * @return the file_path
		 */
		public String getFile_path() {
			return file_path;
		}


		/**
		 * @param file_path the file_path to set
		 */
		public void setFile_path(String file_path) {
			this.file_path = file_path;
			this.tfArchivo.setText(file_path);
		}


		/**
		 * @return the archivo
		 */
		public File getArchivo() {
			return archivo;
		}


		/**
		 * @param archivo the archivo to set
		 */
		public void setArchivo(File archivo) {
			this.archivo = archivo;
		}


		/**
		 * @return the materia
		 */
		public Materia getMateria() {
			return materia;
		}


		/**
		 * @param materia the materia to set
		 */
		public void setMateria(Materia materia) {
			this.materia = materia;
		}


		/**
		 * Sirve para abrir una ventana con texto
		 * @param model "texto a mostrar"
		 */
		public void present(String model) {
			JOptionPane.showMessageDialog(null, model," " + Locale.MESSAGE,1);
		}
		
		/**
		 * Sirve para abrir un carte de warning
		 * @param msg "String texto del mensaje"
		 * @param title "String titulo de la ventana"
		 */
		public void presentWarning(String msg,String title) {
			JOptionPane.showMessageDialog(null,msg,title,JOptionPane.WARNING_MESSAGE);
		}
	
		/**
		 * Cierra la ventana actual sin salir del programa
		 */
		public void close(){
			jfWindow.dispose();
		}

		/**
		 * Permite Agregar un listener a la ventana
		 * @param windowAdapter
		 */
		public void addWindowListener(WindowAdapter windowAdapter) {
			jfWindow.addWindowListener(windowAdapter);
			
		}
		
		
		/**
		 * Abre la ventana para seleccionar un archivo
		 * y establece el archivo seleccionado en file
		 */
		private void selectFile() { 
			File file = null;
			JFileChooser fc = new JFileChooser();
			FileNameExtensionFilter filter = new FileNameExtensionFilter(".txt,.pdf,.doc,.docx files", "txt", "pdf", "doc","docx");
	        fc.setFileFilter(filter);
			FileSystemView system = FileSystemView.getFileSystemView();
			File homeDir = system.getHomeDirectory();
			fc.setCurrentDirectory (homeDir); 
			int result = fc.showOpenDialog(null);		
			if (result == JFileChooser.APPROVE_OPTION) {
				file = fc.getSelectedFile();
				int n = JOptionPane.showConfirmDialog(null,Locale.LOAD+": "+file.getName(),Locale.MESSAGE,JOptionPane.YES_NO_OPTION);
				if (n == JOptionPane.OK_OPTION) {				
						setFile_path(file.getName());
						setArchivo(file);
					}
					else {
						fc.cancelSelection();
					}
				}
			else {
				fc.cancelSelection();
			}
		}
	}
